<!DOCTYPE html>
<html lang="cn" dir="ltr">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="基于cocoyaxi 协程库
#基本概念 协程是运行于线程中的轻量级调度单位。 协程之于线程，类似于线程之于进程。 一个进程中可以存在多个线程，一个线程中可以存在多个协程。 协程所在的线程一般被称为调度线程。 协程发生 io 阻塞或调用 sleep 等操作时，调度线程会挂起此协程。 协程挂起时，调度线程会切换到其他等待中的协程运行。 协程的切换是在用户态进行的，比线程间的切换更快。  协程非常适合写网络程序，可以实现同步的编程方式，不需要异步回调，大大减轻了程序员的思想负担。
co 协程库实现的是一种类似 golang 的协程，有如下特性：
 支持多线程调度，默认线程数为系统 CPU 核数。 共享栈，同一线程中的协程共用若干个栈(大小默认为 1MB)，内存占用低，Linux 上的测试显示 1000 万协程只用了 2.8G 内存(仅供参考)。 协程创建后，始终在同一个线程中运行，而不会切换到其他线程。 各协程之间为平级关系，可以在任何地方(包括在协程中)创建新的协程。  #用途 协程的优势在于可以类似线程的方式无限创建（千万个协程），而线程不能无限开易语言中也就几千线程多了太多会崩。 在阻塞场景下协程特性会有很大优势，在无阻塞的场景下效率比线程池要低10%左右。  #协程API#A_协程_启动〈无返回值〉 A_协程_启动 （子程序指针 函数指针，整数型 参数）
#A_协程_延时〈无返回值〉 A_协程_延时 （长整数型 参数）
#A_协程_取协程ID〈整数型〉 A_协程_取协程ID （）
此函数返回当前协程的 id,此函数一般在协程中调用，在非协程中调用时，返回值是 -1。
可以用于判断代码是在协程内还是线程内。
#示例var codes = Ecode.">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="协程" />
<meta property="og:description" content="基于cocoyaxi 协程库
#基本概念 协程是运行于线程中的轻量级调度单位。 协程之于线程，类似于线程之于进程。 一个进程中可以存在多个线程，一个线程中可以存在多个协程。 协程所在的线程一般被称为调度线程。 协程发生 io 阻塞或调用 sleep 等操作时，调度线程会挂起此协程。 协程挂起时，调度线程会切换到其他等待中的协程运行。 协程的切换是在用户态进行的，比线程间的切换更快。  协程非常适合写网络程序，可以实现同步的编程方式，不需要异步回调，大大减轻了程序员的思想负担。
co 协程库实现的是一种类似 golang 的协程，有如下特性：
 支持多线程调度，默认线程数为系统 CPU 核数。 共享栈，同一线程中的协程共用若干个栈(大小默认为 1MB)，内存占用低，Linux 上的测试显示 1000 万协程只用了 2.8G 内存(仅供参考)。 协程创建后，始终在同一个线程中运行，而不会切换到其他线程。 各协程之间为平级关系，可以在任何地方(包括在协程中)创建新的协程。  #用途 协程的优势在于可以类似线程的方式无限创建（千万个协程），而线程不能无限开易语言中也就几千线程多了太多会崩。 在阻塞场景下协程特性会有很大优势，在无阻塞的场景下效率比线程池要低10%左右。  #协程API#A_协程_启动〈无返回值〉 A_协程_启动 （子程序指针 函数指针，整数型 参数）
#A_协程_延时〈无返回值〉 A_协程_延时 （长整数型 参数）
#A_协程_取协程ID〈整数型〉 A_协程_取协程ID （）
此函数返回当前协程的 id,此函数一般在协程中调用，在非协程中调用时，返回值是 -1。
可以用于判断代码是在协程内还是线程内。
#示例var codes = Ecode." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://qianyuexingfu.gitee.io/doc/3_%E5%8D%8F%E7%A8%8B/" /><meta property="article:section" content="doc" />



<title>协程 | Documents for AAlib</title>
<link rel="manifest" href="../../manifest.json">
<link rel="icon" href="../../favicon.png" type="image/x-icon">
<link rel="stylesheet" href="../../book.min.3805156b94af62087ed8ccedc7a4d16449cb626453feea23d18d8459cc058f06.css" integrity="sha256-OAUVa5SvYgh&#43;2Mztx6TRZEnLYmRT/uoj0Y2EWcwFjwY=" crossorigin="anonymous">
  <script defer src="../../flexsearch.min.js"></script>
  <script defer src="../../cn.search.min.bae2e533ea2a941ee0268e8fb0f8515fc45cc9c24eee6e75bfad4fc9561fe79f.js" integrity="sha256-uuLlM&#43;oqlB7gJo6PsPhRX8RcycJO7m51v61PyVYf558=" crossorigin="anonymous"></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
  
</head>
<body dir="ltr">
  <input type="checkbox" class="hidden toggle" id="menu-control" />
  <input type="checkbox" class="hidden toggle" id="toc-control" />
  <main class="container flex">
    <aside class="book-menu">
      <div class="book-menu-content">
        
  <nav>
<h2 class="book-brand">
  <a href="../../"><span>Documents for AAlib</span>
  </a>
</h2>


<div class="book-search">
  <input type="text" id="book-search-input" placeholder="搜索" aria-label="搜索" maxlength="64" data-hotkeys="s/" />
  <div class="book-search-spinner hidden"></div>
  <ul id="book-search-results"></ul>
</div>











  



  
  <ul>
    
      
        <li>
          
  
  

  
    <span>关于</span>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="../../about/co/" class="">简介</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../about/contact/" class="">联系</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../about/sponsor/" class="">赞助💕</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
      
        <li>
          
  
  

  
    <span>AALib 参考文档</span>
  

          
  <ul>
    
      
        <li>
          
  
  

  
    <a href="../../doc/1base/" class="">基础命令</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/2mimalloc/" class="">内存池</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/3_%E5%8D%8F%E7%A8%8B/" class=" active">协程</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/4_%E6%97%A5%E5%BF%97/" class="">日志</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/5_%E6%AD%A3%E5%88%99/" class="">正则</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/6_%E7%BC%96%E7%A0%81%E8%BD%AC%E6%8D%A2/" class="">编码转换</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/7_rjson/" class="">Rjson</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/8_%E9%85%8D%E7%BD%AE/" class="">配置</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/9_%E8%AF%BB%E5%86%99%E9%94%81/" class="">读写锁</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/10_%E5%93%88%E5%B8%8C%E8%A1%A8/" class="">哈希表</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/11_%E6%95%B0%E6%8D%AE%E5%BA%93/" class="">数据库</a>
  

        </li>
      
    
      
        <li>
          
  
  

  
    <a href="../../doc/12_%E5%8F%8C%E7%AB%AF%E9%98%9F%E5%88%97/" class="">双端队列</a>
  

        </li>
      
    
  </ul>

        </li>
      
    
  </ul>















</nav>




  <script>(function(){var e=document.querySelector("aside .book-menu-content");addEventListener("beforeunload",function(){localStorage.setItem("menu.scrollTop",e.scrollTop)}),e.scrollTop=localStorage.getItem("menu.scrollTop")})()</script>


 
      </div>
    </aside>

    <div class="book-page">
      <header class="book-header">
        
  <div class="flex align-center justify-between">
  <label for="menu-control">
    <img src="../../svg/menu.svg" class="book-icon" alt="Menu" />
  </label>

  <strong>协程</strong>

  <label for="toc-control">
    
    <img src="../../svg/toc.svg" class="book-icon" alt="Table of Contents" />
    
  </label>
</div>


  
  <aside class="hidden clearfix">
    
  
<nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li><a href="#基本概念">基本概念</a></li>
        <li><a href="#用途">用途</a></li>
        <li><a href="#协程api">协程API</a>
          <ul>
            <li><a href="#a_协程_启动">A_协程_启动</a></li>
            <li><a href="#a_协程_延时">A_协程_延时</a></li>
            <li><a href="#a_协程_取协程id">A_协程_取协程ID</a></li>
            <li><a href="#示例">示例</a></li>
          </ul>
        </li>
        <li><a href="#协程锁">协程锁</a>
          <ul>
            <li><a href="#a_协程_锁_创建">A_协程_锁_创建</a></li>
            <li><a href="#a_协程_锁_加锁">A_协程_锁_加锁</a></li>
            <li><a href="#a_协程_锁_解锁">A_协程_锁_解锁</a></li>
            <li><a href="#a_协程_锁_销毁">A_协程_锁_销毁</a></li>
            <li><a href="#示例-1">示例</a></li>
          </ul>
        </li>
        <li><a href="#协程事件">协程事件</a>
          <ul>
            <li><a href="#a_协程_事件_创建">A_协程_事件_创建</a></li>
            <li><a href="#a_协程_事件_触发">A_协程_事件_触发</a></li>
            <li><a href="#a_协程_事件_等待">A_协程_事件_等待</a></li>
            <li><a href="#a_协程_事件_销毁">A_协程_事件_销毁</a></li>
            <li><a href="#示例-2">示例</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</nav>



  </aside>
  
 
      </header>

      
      
  <article class="markdown"><p>基于cocoyaxi 协程库</p>
<h2 id="基本概念"><a class="anchor" href="#%e5%9f%ba%e6%9c%ac%e6%a6%82%e5%bf%b5">#</a>基本概念</h2>
<ul>
<li>协程是运行于线程中的轻量级调度单位。</li>
<li>协程之于线程，类似于线程之于进程。</li>
<li>一个进程中可以存在多个线程，一个线程中可以存在多个协程。</li>
<li>协程所在的线程一般被称为<strong>调度线程</strong>。</li>
<li>协程发生 io 阻塞或调用 sleep 等操作时，调度线程会挂起此协程。</li>
<li>协程挂起时，调度线程会切换到其他等待中的协程运行。</li>
<li>协程的切换是在用户态进行的，比线程间的切换更快。</li>
</ul>
<p>协程非常适合写网络程序，可以实现<strong>同步的编程方式</strong>，不需要异步回调，大大减轻了程序员的思想负担。</p>
<p>co 协程库实现的是一种类似 <a href="https://github.com/golang/go/">golang</a> 的协程，有如下特性：</p>
<ul>
<li>支持多线程调度，默认线程数为系统 CPU 核数。</li>
<li>共享栈，同一线程中的协程共用若干个栈(大小默认为 1MB)，内存占用低，Linux 上的测试显示 1000 万协程只用了 2.8G 内存(仅供参考)。</li>
<li>协程创建后，始终在同一个线程中运行，而不会切换到其他线程。</li>
<li>各协程之间为平级关系，可以在任何地方(包括在协程中)创建新的协程。</li>
</ul>
<h2 id="用途"><a class="anchor" href="#%e7%94%a8%e9%80%94">#</a>用途</h2>
<ul>
<li>协程的优势在于可以类似线程的方式无限创建（千万个协程），而线程不能无限开易语言中也就几千线程多了太多会崩。</li>
<li>在阻塞场景下协程特性会有很大优势，在无阻塞的场景下效率比线程池要低10%左右。</li>
</ul>
<h2 id="协程api"><a class="anchor" href="#%e5%8d%8f%e7%a8%8bapi">#</a>协程API</h2>
<h3 id="a_协程_启动"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e5%90%af%e5%8a%a8">#</a>A_协程_启动</h3>
<p>〈无返回值〉 A_协程_启动 （子程序指针 函数指针，整数型 参数）</p>
<h3 id="a_协程_延时"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e5%bb%b6%e6%97%b6">#</a>A_协程_延时</h3>
<p>〈无返回值〉 A_协程_延时 （长整数型 参数）</p>
<h3 id="a_协程_取协程id"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e5%8f%96%e5%8d%8f%e7%a8%8bid">#</a>A_协程_取协程ID</h3>
<p>〈整数型〉 A_协程_取协程ID （）<br>
此函数返回当前协程的 id,此函数一般在协程中调用，在非协程中调用时，返回值是 -1。<br>
可以用于判断代码是在协程内还是线程内。</p>
<h3 id="示例"><a class="anchor" href="#%e7%a4%ba%e4%be%8b">#</a>示例</h3>
<div>
    <link href="../../ecode/ecode.css" type="text/css" rel="stylesheet">
    <script type="text/javascript" src="../../ecode/ecode.js"></script>
    <div class="col-lg-6" style="height: auto; width: 100%; font-size: 8px">
        <div class="ecode" id="e协程示例" desc="代码段: 协程示例" style="height: auto; width: 100%; font-size: 8px"></div>
    </div>
    <div>
      
    </div>
    <script>
        var codes = Ecode.create();
        function putin() {
            EcodeSetCode(document.getElementById("e协程示例"),"\r\n.版本 2\r\n.支持库 aalib\r\n\r\n.子程序 _按钮2_被单击\r\n\r\nA_协程_启动 (\u0026子程序2, 8)\r\n\r\n.子程序 子程序2\r\n.参数 a, 整数型\r\n\r\n\u0027 协程_延时 (5000)\r\n信息框 (到文本 (a), 0, , )\r\n\r\n");
            codes.trans();
        }
        putin();
    </script>

</div>


<h2 id="协程锁"><a class="anchor" href="#%e5%8d%8f%e7%a8%8b%e9%94%81">#</a>协程锁</h2>
<h3 id="a_协程_锁_创建"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e9%94%81_%e5%88%9b%e5%bb%ba">#</a>A_协程_锁_创建</h3>
<p>〈整数型〉 A_协程_锁_创建 （）</p>
<h3 id="a_协程_锁_加锁"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e9%94%81_%e5%8a%a0%e9%94%81">#</a>A_协程_锁_加锁</h3>
<p>〈无返回值〉 A_协程_锁_加锁 （长整数型 锁句柄）</p>
<h3 id="a_协程_锁_解锁"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e9%94%81_%e8%a7%a3%e9%94%81">#</a>A_协程_锁_解锁</h3>
<p>〈无返回值〉 A_协程_锁_解锁 （长整数型 锁句柄）</p>
<h3 id="a_协程_锁_销毁"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e9%94%81_%e9%94%80%e6%af%81">#</a>A_协程_锁_销毁</h3>
<p>〈无返回值〉 A_协程_锁_销毁 （长整数型 锁句柄）</p>
<h3 id="示例-1"><a class="anchor" href="#%e7%a4%ba%e4%be%8b-1">#</a>示例</h3>
<p>操作全局对象要加锁。
<div>
    <link href="../../ecode/ecode.css" type="text/css" rel="stylesheet">
    <script type="text/javascript" src="../../ecode/ecode.js"></script>
    <div class="col-lg-6" style="height: auto; width: 100%; font-size: 8px">
        <div class="ecode" id="e协程锁示例" desc="代码段: 协程锁示例" style="height: auto; width: 100%; font-size: 8px"></div>
    </div>
    <div>
      
    </div>
    <script>
        var codes = Ecode.create();
        function putin() {
            EcodeSetCode(document.getElementById("e协程锁示例"),"\r\n.版本 2\r\n.支持库 aalib\r\n\r\n.子程序 _按钮4_被单击\r\n.局部变量 a, 整数型\r\n\r\na ＝ A_协程_锁_创建 ()\r\nA_协程_启动 (\u0026子程序1, a)\r\nA_协程_启动 (\u0026子程序3, a)\r\n\r\n.子程序 子程序1\r\n.参数 a, 整数型\r\n\r\nA_协程_锁_加锁 (a)\r\n信息框 (“2”, 0, , )\r\nA_协程_锁_解锁 (a)\r\n\r\n");
            codes.trans();
        }
        putin();
    </script>

</div>

</p>
<h2 id="协程事件"><a class="anchor" href="#%e5%8d%8f%e7%a8%8b%e4%ba%8b%e4%bb%b6">#</a>协程事件</h2>
<h3 id="a_协程_事件_创建"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e4%ba%8b%e4%bb%b6_%e5%88%9b%e5%bb%ba">#</a>A_协程_事件_创建</h3>
<p>〈整数型〉 A_协程_事件_创建 （）</p>
<h3 id="a_协程_事件_触发"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e4%ba%8b%e4%bb%b6_%e8%a7%a6%e5%8f%91">#</a>A_协程_事件_触发</h3>
<p>〈无返回值〉 A_协程_事件_触发 （整数型 句柄，整数型 附加数据）</p>
<h3 id="a_协程_事件_等待"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e4%ba%8b%e4%bb%b6_%e7%ad%89%e5%be%85">#</a>A_协程_事件_等待</h3>
<p>〈逻辑型〉 A_协程_事件_等待 （整数型 句柄，整数型 等待时间，整数型变量 附加数据）</p>
<h3 id="a_协程_事件_销毁"><a class="anchor" href="#a_%e5%8d%8f%e7%a8%8b_%e4%ba%8b%e4%bb%b6_%e9%94%80%e6%af%81">#</a>A_协程_事件_销毁</h3>
<p>〈无返回值〉 A_协程_事件_销毁 （整数型 句柄）</p>
<h3 id="示例-2"><a class="anchor" href="#%e7%a4%ba%e4%be%8b-2">#</a>示例</h3>
<div>
    <link href="../../ecode/ecode.css" type="text/css" rel="stylesheet">
    <script type="text/javascript" src="../../ecode/ecode.js"></script>
    <div class="col-lg-6" style="height: auto; width: 100%; font-size: 8px">
        <div class="ecode" id="e协程同步事件" desc="代码段: 协程同步事件" style="height: auto; width: 100%; font-size: 8px"></div>
    </div>
    <div>
      
    </div>
    <script>
        var codes = Ecode.create();
        function putin() {
            EcodeSetCode(document.getElementById("e协程同步事件"),"\r\n.版本 2\r\n.支持库 aalib\r\n\r\n.子程序 协程同步事件测\r\n.局部变量 句柄, 整数型\r\n.局部变量 子程序6, 子程序指针\r\n\r\n句柄 ＝ A_协程_事件_创建 ()\r\n\r\nA_协程_启动 (\u0026子程序6, 句柄)\r\nA_协程_启动 (\u0026子程序7, 句柄)\r\n\r\n.子程序 子程序6\r\n.参数 句柄, 整数型\r\n.局部变量 附加数据, 整数型\r\n.局部变量 txt, 文本型\r\n.局部变量 tt, 逻辑型\r\n\r\n\r\ntt ＝ A_协程_事件_等待 (句柄, -1, 附加数据)\r\n.如果 (tt ＝ 真 且 附加数据 ≠ 0)\r\n    txt ＝ 到文本 (读字节集 (附加数据))\r\n    信息框 (A_变量到文本E (tt, txt), 0, , )\r\n.否则\r\n\r\n.如果结束\r\n\r\n\u0027 协程_事件_销毁 (句柄) 如果等待超时 不为-1 要注意不要提前销毁句柄 触发无效句柄会崩溃\r\n\r\n.子程序 子程序7\r\n.参数 句柄, 整数型\r\n.局部变量 addr, 整数型\r\n\r\n\u0027 协程_延时 (1000)\r\naddr ＝ 写字节集 (到字节集 (“附加数据!”))\r\nA_协程_事件_触发 (句柄, addr)\r\n\r\n");
            codes.trans();
        }
        putin();
    </script>

</div>


</article>
 
      

      <footer class="book-footer">
        
  <div class="flex flex-wrap justify-between">





</div>

 
        









      </footer>

      
  
 

      <label for="menu-control" class="hidden book-menu-overlay"></label>
    </div>

    
    <aside class="book-toc">
      <div class="book-toc-content">
        
  
<nav id="TableOfContents">
  <ul>
    <li>
      <ul>
        <li><a href="#基本概念">基本概念</a></li>
        <li><a href="#用途">用途</a></li>
        <li><a href="#协程api">协程API</a>
          <ul>
            <li><a href="#a_协程_启动">A_协程_启动</a></li>
            <li><a href="#a_协程_延时">A_协程_延时</a></li>
            <li><a href="#a_协程_取协程id">A_协程_取协程ID</a></li>
            <li><a href="#示例">示例</a></li>
          </ul>
        </li>
        <li><a href="#协程锁">协程锁</a>
          <ul>
            <li><a href="#a_协程_锁_创建">A_协程_锁_创建</a></li>
            <li><a href="#a_协程_锁_加锁">A_协程_锁_加锁</a></li>
            <li><a href="#a_协程_锁_解锁">A_协程_锁_解锁</a></li>
            <li><a href="#a_协程_锁_销毁">A_协程_锁_销毁</a></li>
            <li><a href="#示例-1">示例</a></li>
          </ul>
        </li>
        <li><a href="#协程事件">协程事件</a>
          <ul>
            <li><a href="#a_协程_事件_创建">A_协程_事件_创建</a></li>
            <li><a href="#a_协程_事件_触发">A_协程_事件_触发</a></li>
            <li><a href="#a_协程_事件_等待">A_协程_事件_等待</a></li>
            <li><a href="#a_协程_事件_销毁">A_协程_事件_销毁</a></li>
            <li><a href="#示例-2">示例</a></li>
          </ul>
        </li>
      </ul>
    </li>
  </ul>
</nav>


 
      </div>
    </aside>
    
  </main>

  
</body>
</html>












